home *** CD-ROM | disk | FTP | other *** search
- /*
-
- SEND_DATA_BUFFER_MANAGEMENT
- (SENDBM)
-
- Process the data which then will be sent to HS.
-
- INPUT : Pointer to verb, pointer to RCB.
-
- CopyRight 1995. Nicholas Poljakov all rights reserved.
-
- */
-
- #include <sendat.h>
- #include <state1.h>
- #include <rcb.h>
- #include <stdio.h>
- #include <malloc.h>
- #include <string.h>
- int sk_r_wt(void *);
- int setrc(void *, void *);
- int sendhsf(void *);
- int sendhs(void *);
- int sendbm(void *, void *);
- int sendat(void *);
- int rtsend(void *);
- unsigned long rmfmh5(void *, void *);
- int recwait(void *);
- int rcvru(void *, void *);
- int rcvhs(void *, void *, void *, void *);
- int ralloc(void *, void *);
- int psrm(int, void *, void *);
- int ps_conv(int, void *);
- int proterr(void *, unsigned long);
- int preptrcv(void *, void *);
- int post_rcb(void *);
- struct repass *postopen(void *);
- int phsrec(void *);
- int pfmh5(void *);
- int opndst(void *);
- int obtsess(void *, unsigned char);
- int Lrf_handler(void *);
- int get_sess(void *, void *);
- int get_attr(void *);
- int fsm_error(unsigned char, void *);
- int fsm_conv(unsigned char, unsigned char, void *);
- int flush (void *);
- int dcp(void *);
- int dealloc(void *);
- int crtp(void *);
- int conv(void *);
- int chkparm(void *, void *);
- int check_end(unsigned int, void *);
- struct rqb *call_appl(void *);
- int buffmng(unsigned char, void *, void *, void *, unsigned, unsigned char, unsigned);
- unsigned long attltck(void *);
- unsigned long attacheck(void *);
- char *cgetmem(int, int);
- int sendhsf(void *);
- int opndst(void *);
- int alloc_rcb(void *, void *);
- int allocate(void *);
- int clsdst(void *);
-
- sendbm(pptr, p_rcb)
- struct send_data *pptr;
- struct rcb *p_rcb;
- {
- char *p;
- int lt;
- int rest;
- char *p_ll;
- unsigned short l_str;
- char *p1;
- int i;
- unsigned short *m;
- char code;
- char *buff;
- unsigned int type;
- unsigned char dsc;
- unsigned char temp;
-
- #if OS_TYPE == 1
- /********* Trace facility **********/
- unsigned int rtype; /* type of record */
- unsigned int pnum; /* point number */
- char pname[8]; /* name of module */
- char *drec; /* record for dump */
- int lenr; /* record length */
-
- rtype = INPROC;
- strcpy(pname, "sendbm");
- pnum = 1;
- drec = pptr;
- lenr = sizeof(struct send_data);
- gtf(rtype, pname, pnum, drec, lenr);
- /***********************************/
- #endif
-
- p_ll = pptr->data_addr;
- m = (short *)pptr -> data_addr;
- l_str = *m;
- p1 = &l_str;
-
- l_str &= 0x7fff; /* turn off high bit */
-
- p = pptr->data_addr;
- lt = pptr -> data_lt;
- code = 'A';
- buff = &((*p_rcb).first_out);
-
- if (p_rcb->send_ll_remainder == 0) {
-
- /* Make the LL-processing;
- * Check if LL is wrong (wrong values are the following:
- * X'0000',X'8000',X'8001'.
- * Value X'0001' is right for PS header only.
- */
- m = (short *)pptr-> data_addr;
- switch (*m) {
- case 0x0000:
- /* case 0x0001: */
- case 0x8000:
- case 0x8001:
- goto bad_return;
- }
- if ((pptr->data_lt) > l_str)
- goto bad_return;
- p_rcb->send_ll_remainder = l_str - pptr->data_lt;
- temp = p[0]; /* for compatibility */
- p[0] = p[1]; /* whith */
- p[1] = temp; /* IBM mainframe */
- }
- else
- {
- if (pptr->data_lt > p_rcb->send_ll_remainder)
- goto bad_return; /* One GDS per send */
- p_rcb->send_ll_remainder -= pptr->data_lt;
- }
- rest = lt;
- type = Send_data;
- do {
- rest -= MAX_RU;
- if (rest > 0) {
- lt = MAX_RU;
- dsc = 1;
- }
- else
- {
- lt = rest + MAX_RU;
- rest = 0;
- dsc = 0;
- }
- if ((p1 = malloc(lt)) == NULL) {
- pptr -> prim_rc = INCOMPLETE;
- return (0);
- }
- memcpy(p1, p_ll, lt);
- p_ll += lt;
- buffmng(code, p1, buff, p_rcb, lt, dsc, type);
- } while (rest != 0);
- /*
- sendhs(p_rcb);
- */
- goto ok_return;
- bad_return :
- pptr->prim_rc = PARAMETR_CHECK;
- pptr->sec_rc = BAD_LL;
- ok_return :
- return(0);
- }
-